package com.excilys.formation.project.entities;

import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.validation.constraints.NotNull;

import org.hibernate.annotations.Index;
import org.hibernate.annotations.Type;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
import org.joda.time.DateTime;

/**
 * 
 * @author excilys
 * 
 */
@Entity
public class Transaction implements Comparable<Transaction> {
    /**
     * Taille maximale du libellé.
     */
    private static final int MAX_LIBELLE_SIZE = 255;
    /**
     * Indentifiant de la transation.
     */
    private long id;

    /**
     * setTransaction Ensembles des opérations associées à la transaction.
     */
    private Set<Operation> operations;

    /**
     * Libellé de la transaction.
     */
    private String libelle;

    /**
     * Date de la transaction, par défaut, l'instant présent.
     */
    private DateTime date = DateTime.now();

    /**
     * @return Indentifiant de la transation.
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getId() {
        return id;
    }

    /**
     * @param id
     *            le nouvel indentifiant de la transation.
     */
    public void setId(long id) {
        this.id = id;
    }

    /**
     * 
     * @return l'ensemble des opérations associées à la transaction.
     */
    @OneToMany(mappedBy = "transaction")
    public Set<Operation> getOperations() {
        return operations;
    }

    /**
     * @param operations
     *            les nouvelles opérations liées à la transaction.
     */
    public void setOperations(Set<Operation> operations) {
        this.operations = operations;
    }

    /**
     * Renvoie le libellé de la transaction.
     * 
     * @return le libellé de la transaction
     */
    @NotEmpty
    @Length(max = MAX_LIBELLE_SIZE)
    public String getLibelle() {
        return libelle;
    }

    /**
     * Change le libellé de la transaction.
     * 
     * @param libelle
     *            le nouveau libellé de la transaction.
     */
    public void setLibelle(String libelle) {
        this.libelle = libelle;
    }

    /**
     * @return la date de création de la transaction
     */
    @Index(name = "date")
    @NotNull
    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
    public DateTime getDate() {
        return date;
    }

    /**
     * Modifie la date de création de la transaction.
     * 
     * @param date
     *            la date de création de la transaction.
     */
    public void setDate(DateTime date) {
        this.date = date;
    }

    @Override
    public int compareTo(Transaction o) {
        return -date.compareTo(o.date);
    }

}
